package com.insta.formation.calendar.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.insta.formation.calendar.dao.IGenericDao;

/**
 * Implémentation du DAO générique, les implémentations des autres DAO doive,t
 * étendre celui-ci. Cette classe permet de factoriser les méthodes d’un CRUD.
 * Le constructeur de cette classe permet de typer les objets concernés par le
 * DAO :
 * 
 * @author julien
 * 
 * @param <T>
 * @param <PK>
 */
public abstract class GenericDaoImpl<T, PK extends Serializable> implements IGenericDao<T, PK>
{
	private static final Logger LOGGER = LoggerFactory.getLogger(GenericDaoImpl.class);
	private Class<T> type;

	public GenericDaoImpl(Class<T> type) {
		this.type = type;
	}

	@SuppressWarnings("unchecked")
	public PK create(T o)
	{
		PK pk = null;
		getSession().beginTransaction();
		pk = (PK) getSession().save(o);
		getSession().getTransaction().commit();
		return pk;	
	}
	
	@SuppressWarnings("unchecked")
	public T read(PK id)
	{	
		return (T) getSession().get(type, id);
	}

	@SuppressWarnings("unchecked")
	public List<T> readAll()
	{
		Criteria crit = getSession().createCriteria(type);
		return crit.list();
	}

	public void update(T o)
	{
		getSession().beginTransaction();
		getSession().update(o);
		getSession().getTransaction().commit();
	}

	public void delete(T o)
	{
		getSession().beginTransaction();
		getSession().delete(o);
		getSession().getTransaction().commit();
	}

	public Session getSession()
	{
		return HibernateUtil.INSTANCE.getSession();
	}
}